home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / aminet / os20 / util / skick332.lha / SKick.doc < prev    next >
Text File  |  1993-01-18  |  23KB  |  480 lines

  1.  
  2.                         +++++++++++++++++++++++++
  3.                         +                       +
  4.                         + S K I C K v 2.0 & 3.0 +
  5.                         +                       +
  6.                         +  (C) SinSoft 1992,93  +
  7.                         +                       +
  8.                         +     User's manual     +
  9.                         +                       +
  10.                         +++++++++++++++++++++++++
  11. Introduction.
  12. =============
  13.  
  14. SKick  is  the replacement for Kickit, ZKick and LKick kickers, intended for use
  15. on  A500  or A2000 machines with OS2.0 in ROM (for instance A500+).  Its task is
  16. to  soft-kick  any  other version of kickstart into RAM.  'Any other' means also
  17. the  1.3 kickstart, which was unavailable to kick with any other kicker.  KickIt
  18. and  ZKick  both  require  1.3  ROM for operation and function of LKick from 2.0
  19. isn't   very  stable.   SKick  is  fully  assembly-written  program,  with  many
  20. facilities  added.  The main advantages of SKick are:
  21. - ability to relocate any kickstart image, when the relocation table is supplied
  22.   into any  kind  of  RAM  (CHIP,  FAST,  EXP etc.)
  23. - standard  operation  (like  Kickit etc.), when table is not available
  24. - patch function (patches kickstart image prior its start, which may correct
  25.   known bugs etc.), using supplied patch file
  26. - powerful command line and Workbench interface
  27. - Graphic User Interface (GUI)
  28. - all operations during kicking are made so 'purely' as possible, all structures
  29.   are exactly in the same state as if kicked from ROM
  30. - small code size (even if most powerful, SKick is the shortest from all the 
  31.   kickers)
  32. - relocation tables for new kickstart versions will be automatically available
  33.   for registered users
  34. - loaded kickstart survives any 'soft crash' (without corrupting execbase or 
  35.   kickstart itself) and user reset
  36. - allows use of CoolCapture, romtags and memtags with user programs without any
  37.   limitation
  38.  
  39.  
  40. 1. Copyright.
  41. =============
  42.  
  43. SKick and its documentation files are Copyright (C) SinSoft 1992, Prague, CSFR.
  44. ===============================================================================
  45.  
  46. This  archive  may be freely redistributed, but only in totally unchanged state,
  47. i.e.   no  files  can be added, deleted, modified etc.  All copyright notices in
  48. the   program   and  its  documentation  must  remain  on  their  places.   Also
  49. '.displayme' and other files, usually with 'wonderful' ANSI graphics, so obvious
  50. at various BBS's, cannot be added.
  51.  
  52. 2. Contents of the archive.
  53. ===========================
  54.  
  55. This .LHA archive MUST contain following files:
  56.  
  57.     SKick          -  executable code of the program
  58.     SKick.info    -  program icon
  59.     SKick.doc     -  this file
  60.     History.doc   -  development history - PLEASE READ FOR LATEST CHANGES
  61.  
  62.     directory Kickstarts:
  63.         kick39110.A500.BETA.RTB        *)
  64.         kick39110.A500.BETA.PAT
  65.         kick39106.A1200.RTB        **)
  66.         kick39106.A500.BETA.RTB        *)
  67.         kick39106.A500.BETA.PAT
  68.         kick39046.A500.BETA.RTB        *)
  69.         kick39046.A500.BETA.PAT
  70.         kick37175.A500.RTB         **)
  71.         kick36143.A3000.RTB        ***)
  72.             kick36143.A3000.PAT
  73.         kick34005.A500.RTB
  74.         kick34005.A500.PAT
  75. *)
  76.     These kickstart versions are available only to official developers.
  77. **)
  78.     Patch table not required to use these kickstarts.
  79. ***)    
  80.         This kickstart was available on SuperKickstart disk for A3000.
  81.     Patch file makes usage of this kickstart on A500 possible. 
  82.         However, this 'historical' version of OS is obsolete and it is not
  83.         recommended to use it.
  84.  
  85.  
  86. NOTE TO COMMODORE:
  87.   Sorry  CBM  for  a  small  law-break (I hope small) from my side:  I'm not the
  88. official  developer,  but I have Your BETA releases on my drive:  they came into
  89. Czechoslovakia  from  some  pirate  BBS  in  Germany and they are available from
  90. general  Amiga population.  I've never misused or abused them and I also keep in
  91. mind  Your  copyrights:   I  never redistribute them.  But when I've got them, I
  92. wanted  to help another people and do some useful work:  All known kickers (they
  93. are  PD,  aren't they?) seemed to be imperfect in some aspects for me and then I
  94. realized  to  write my own kicker to meet all my needs and give it to all people
  95. which need it too.
  96.  
  97. 3. System requirements.
  98. =======================
  99.  
  100. SKick may be operated, if the following requirements are met:
  101. - Computer: Amiga 500, 600, 1000, 1200 and 2000 with 68000, '010 and '020 
  102.   processors
  103. - Minimum 1 meg of RAM (possibly only Chip RAM, expansion RAM isn't needed when
  104.   relocation is to be used)
  105. - Kickstart   2.0  or  3.0  in  ROM  (not tested with V36, because there are not
  106.   machines with V36 ROM in Czechoslovakia, developed and tested under 37.175 and
  107.   39.106)
  108.  
  109. That's  all.  When Your system meets all these requirements, You are able to use
  110. SKick.   Of course, large amount of RAM (especially expansion RAM) will help You
  111. use non-relocatable kickstarts (they are located from $200000 obviously), but it
  112. is not necessary.
  113.  
  114. Skick is designed to work on machines without a MMU.  For machines with the MMU,
  115. there  exist suitable software to do such work.  Especially, program SoftBoot is
  116. available  to  official developers and allows to remap any RAM to the $F8 space,
  117. thus emulating the ROM.
  118.  
  119.  
  120. NOTE:  Because of a nature of 2.0 system, it is impossible to kick anything from
  121. address  $c00000  exactly.  The first usable address is $c40000.  1.3 system did
  122. allow  this, 2.0 doesn't.  It is because the system restart is more drastic than
  123. on 1.3 system. 
  124.     
  125.  
  126. 4. Installation.
  127. ================
  128.  
  129. Installation  of  SKick  and  related  files  is  very  simple.   Please  follow
  130. instructions below:
  131.  
  132. On  Amiga  3000,  there  is the convention, that during cold start process, file
  133. 'DEVS:kickstart' is read into memory and run.  To make the possibility to choose
  134. from  several  kickstarts,  SKick searches kickstart images and related files on
  135. the directory DEVS:kickstarts.  Your first step is to issue the command
  136.  
  137. >Makedir DEVS:kickstarts 
  138.  
  139. from  the  Shell,  so  the appropriate subdirectory will be created on Your boot
  140. partition (usually hard disk).
  141.  
  142. Your  second  step  is  to  copy  the  auxiliary files (.RTB and .PAT) from this
  143. archive,  if  You  wish  to  use  them, and to add appropriate kickstart images.
  144. SKick can handle both 'exact ROM images' and files intended for Kickit and other
  145. kickers.
  146. When  copying  kickstart  images,  rename them with names of .RTB/PAT files, but
  147. without  any  extension; or, vice versa, rename auxiliary files according to the
  148. main  file.  All the files of one particular kickstart must have identical names
  149. (except extensions).
  150.  
  151.  
  152. IMPORTANT  NOTE:  There are no kickstart images in this archive!  Supplied files
  153. only  allow  to use standard 1.3 ROM image, which may be obtained from Commodore
  154. (one  method  :   buy  A3000 SuperKickstart disk, it also contains this, and use
  155. some  disk  tool  or  monitor  to  grab it from the disk into the file.  Another
  156. method:   Somebody  will  upgrade  his A500 1.3 with a new 2.04 ROM.  Because he
  157. bought old 1.3 ROM with his machine, it continues to be his ownership and may be
  158. used.   There  is  no  need  to  buy hardware add-on (ROM-Switches etc), and the
  159. contents  of the old ROM may be copied into the file before replacement and then
  160. used.   ('Backup  copy')).  There are also files for another kickstart versions.
  161. Some  of  them are available to the official developers only.  I hope that SKick
  162. will  help  them to keep their work.  It's only a dream for me to be an official
  163. developer...
  164.  
  165. The  third step is to copy SKick itself (with its icon) into any place where You
  166. wish to have it.  Please read the following chapter for more explanation.
  167.  
  168. 5. SKick usage
  169. ==============
  170.  
  171. SKick may be called either from the Shell or from the Workbench.
  172.  
  173. 5.1 Invocation from the Shell
  174. =============================
  175.  
  176. When invocating SKick from the Shell, following template should be used:
  177.  
  178. NAME,ADR/K,FORCE/S,EXT/S,CHIP/S,FAST/S,NOEXT/S,NOREL/S,NOPATCH/S,QUIET/S,
  179. GUI/S,RELSTACK/S,FASTRES/S
  180.  
  181. There are two optional parameters and many switches.
  182.  
  183. NAME
  184. ==== 
  185. This  parameter  specifies  the  file name with full path of the kickstart to be
  186. loaded.   If  omitted,  SKick will do nothing, until GUI is called either by its
  187. switch  (GUI)  or  by pressing left mouse button during program run.
  188.  
  189. ADR
  190. ===
  191. ADR parameter allows You to specify the address for the relocatable kickstart to
  192. be  loaded.   The address must be entered in hex, and only the upper byte of the
  193. address is  entered.   It  is  also  assumed  always to be in 24-bit space.  For
  194. example, when You wish to load Your kickstart image from $C80000, please specify
  195. Your  wish  with  'ADR  C8'  or 'ADR $C8', or possibly 'ADR $00C8'.  NOTE:  This
  196. option  is  only  useful  for  special cases, like debugging etc.  Normally, the
  197. fully automatic search for the appropriate place is performed and the best place
  198. for  the  kickstart  is found.  NOTE for users with 'kickstart RAM':  A1000's or
  199. any  other  machines, having RAM from $F00000, allow loading into this location.
  200. In  such  case,  the  command  SKick  <name> ADR F0 FORCE has to be used, as the
  201. kickstart RAM isn't normally accessed, and obviously it is not added to the free
  202. memory list.
  203.  
  204. FORCE
  205. =====
  206. This  switch  allows  You  to  force  load  to  the place, which is not normally
  207. contained  on  the  memlist.  It is designed to help when loading kickstart into
  208. non-autoconfiguring  memory  expansion  board, which was not added to the system
  209. yet.   This  switch is not recommended for general use, as its incorrect use may
  210. cause drastic unpredictable results.
  211.  
  212. EXT,CHIP,FAST
  213. ============= 
  214. These 3 switches specify the kind of memory the free space will be searched for.
  215. Only  one of them may be selected; when unspecified, all standard memory address
  216. ranges are scanned in the order of EXT, FAST and CHIP.
  217.  
  218. NOEXT
  219. =====
  220. This  switch  excludes external memory from being searched.  Search is performed
  221. for FAST and CHIP memory only.  This switch may be used, if user wants to have a
  222. big  amount of memory in one large block.  Normally, its use is not recommended,
  223. because the speed of kickstart will be decreased when multi-bitplane video modes
  224. are selected.
  225.  
  226. NOREL
  227. =====
  228. NOREL  switch  disables  the  relocation process even if the relocation table is
  229. present.   Kickstart  will  be  loaded  exactly to the place it is assembled, if
  230. available.   When the kickstart is assembled from $200000 and You have expansion
  231. RAM,  there  are  no  problems.  Problems will occur when using normal ROM image
  232. from $f80000 or $fc0000, for example kickstart 1.3.  In these cases, this switch
  233. cannot be used.
  234.  
  235. NOPATCH
  236. =======
  237. This  flag  suppresses  the patch facility.  Normally, when .PAT file is present
  238. for  given  kickstart,  it will be opened and kickstart patched to correct known
  239. bugs.   When  this flag is used, patching is suppressed.  NOTE:  Some kickstarts
  240. may  REQUIRE  patching.   For  example,  39.46  Beta  contains very serious bugs
  241. preventing it from being started without patching on most machines without 68020
  242. or  greater  CPU.   Standard 1.3 must be patched to allow more than 512K of CHIP
  243. RAM during reboot and to allow correct performing of user reset (CTRL-LA-RA).
  244.  
  245. QUIET
  246. =====
  247. The  QUIET flag supresses all messages writen by the program.  When started from
  248. Shell,  it  has  the  same  effect  like  >NIL:  redirection.  When started from
  249. Workbench, program window is not opened.
  250.  
  251. GUI
  252. ===
  253. The  GUI  switch  activates  the  GUI  screen  of  the program.  GUI may also be
  254. obtained  by pressing the LMB during program run; this may be used when SKick is
  255. run from Startup-Sequence automatically.
  256.  
  257. RELSTACK
  258. ========
  259. In current versions of 3.0 (V39.106 and above), for example in A1200, supervisor
  260. stack is allocated from the top of Chip RAM, when Fast RAM is unavailable.  This
  261. causes  problems  on  machines with Chip RAM only, such as unexpanded A1200.  To
  262. prevent this, RELSTACK option should be included in the command line or ToolType
  263. flag.   When  this  option  is  active,  supervisor  stack is transferred to the
  264. beginning  of  RAM  (standard  AllocMem) and the space already allocated is made
  265. free  prior  the kickstart is attempted to load.  
  266. This  option  is not affected by the GUI mode and cannot be selected from there.
  267. In  other situations than mentioned above (3.0 ROM & Chip RAM only), use of this
  268. option is useless and causes greater memory fragmentation.
  269.  
  270. FASTRES
  271. =======
  272. This option allows Skick's resident module to be allocated in Fast RAM.  Default
  273. memory  location for the module is somewhere in Chip RAM, because it is the most
  274. safe  place.   If particular configuration allows it, specifying this option may
  275. increase speed of reboot/reset.  This option is ignored when booting 1.3 system,
  276. because  it is not usable in this case.  It may also cause problem under certain
  277. conditions.  If Your machine crashes with this switch active, don't use it.
  278.  
  279. 5.2 Invocation from Workbench.
  280. ==============================
  281.  
  282. Invocation  of  the  program from Workbench is very simple:  double-click on its
  283. icon  and  it  will  be performed.  Using 'Information', You may specify all the
  284. Tool Types like from Shell.  All switches are defined as FLAGS.
  285.  
  286. One example:
  287. NAME=devs:kickstarts/kick39046
  288. FLAGS=QUIET|EXT
  289.  
  290. This  definition  automatically loads kickstart named kick39046, does relocation
  291. and  patching,  scans only EXT memory for the space and doesn't issue any screen
  292. output.
  293.  
  294. 5.3 Suggested usage
  295. ===================
  296.  
  297. SKick  is  designed to be called as the first command from the Startup-sequence,
  298. either  with any name, or without it.  When the name is present, SKick will load
  299. appropriate  kickstart  image,  when  running  from  ROM  one.  When the name is
  300. missing,  SKick  will  do  nothing  and remain in ROM.  HOWEVER:  If the user is
  301. holding  LMB during Skick's run, Skick will open its Graphic User Interface.  It
  302. is  the screen very similar to Boot Menu.  There are all the kickstarts found in
  303. the  DEVS:Kickstarts  directory  displayed  and the user may choose any of them.
  304. The ROM kickstart is also displayed as one of them.  They are sorted accordingly
  305. to  their  versions  and revisions.  There are only version and revision numbers
  306. displayed,  not the names of disk files, with the remark (RAM) or (ROM).  In the
  307. lower  part  of  screen, there are 3 gadgets:  Patching (ON/OFF), Load into (ANY
  308. RAM/CHIP  RAM/FAST  RAM/EXP  RAM/NOT  EXP  RAM/) and Relocation (ON/OFF).  These
  309. gadgets play the role of command line switches.
  310.  
  311. Once the GUI is activated, the selection must be made (there is no CANCEL gadget
  312. in  this  version, may be in future ...).  After the selection is made, selected
  313. kickstart  is  simply loaded, regardless of the actual system status (of course,
  314. when  the currently running kickstart is selected, it is NOT reloaded).  This is
  315. done  in  TWO  steps, if necessary.  Let's suppose that RAM kicstart is running,
  316. and we wish another RAM kickstart.  Immediately, SKick will reset the machine to
  317. ROM  and  reboot  it,  but  it  remembers  Your choice first.  When started from
  318. startup-sequence,  it  ignores  all its defaults and also the LMB, automatically
  319. loads  required  RAM  kickstart  and  reboots  again.  When it is called now, it
  320. ignores  its  defaults,  but LMB may be used to change kickstart using GUI.  The
  321. new  kickstart will remain active until next cold start (i.e.  not reboot/reset)
  322. of the machine is performed.  When some loaded kickstart is default and You wish
  323. to  remain  in  ROM,  after  selecting it from the GUI Your select overrides the
  324. default.  Even if rebooted, SKick will NOT load its default file and will remain
  325. in  ROM.   As  an  example,  when we wish to beta-test version 39.110 for a long
  326. time, we put into startup-sequence this line as a first command:
  327.  
  328. SKick devs:kickstarts/kick39046 QUIET
  329.  
  330. This  will  start  39.046  kickstart immediately after system power-up.  When we
  331. wish  to  remain  in  ROM or to use another kickstart, for example 34.005, it is
  332. necessary  to  hold LMB during boot (if we boot from HD it is only 2-3 sec after
  333. Boot  Menu),  and  to  select  our  choice.   Until next cold start (power down,
  334. double-reset  as  explained below or very hard crash), the selection will remain
  335. active  and  SKick  will not be doing anything.  
  336. It is a good idea, to put the SKick icon also in some place to change kickstart,
  337. when  the  system  is fully up and running.  Suggested setting is to use the GUI
  338. switch,  which will bring the menu screen automatically and in every case. 
  339.      NOTE:  When in the Startup-sequence, in the SKick command, the name is used
  340. (i.e.  some RAM kickstart is selected as a default), it is necessary to put some
  341. name  to  the  icon  too,  even if any name is overriden with our choice.  It is
  342. necessary  because  the  Skick  called  from Workbench must know the conditions,
  343. which  have  its  'college' from startup-sequence.  So the suggested setting for
  344. Workbench is:
  345.  
  346. NAME=DUMMY (or anything else)
  347. FLAGS=GUI
  348.  
  349. or  only  the  second  line  if  the  default kickstart is ROM (no name given in
  350. startup-sequence) or the SKick command is not used in it.
  351.  
  352. NOTE:   The  name  of  kickstart  file  is  limited  in  length.  Maximal length
  353. correctly  processed  by  SKick  is 32 characters.  It is the length WITHOUT the
  354. path,  only  pure  filename.  Please accept this limitation.  Longer names cause
  355. malfunction (not crash) of SKick.
  356.  
  357. To  force  the machine to return to the ROM kickstart, very simple operation may
  358. be   used.    The  user  simply  hits  the  reset  combination  (Ctrl-LeftAmiga-
  359. RightAmiga).   The display will disappear from the screen.  After some time from
  360. releasing  reset  buttons,  the screen color will change to 'medium gray' (it is
  361. the  FIRST  color change from many others).  ALso the power LED will shine fully
  362. from  this  moment.   This  is  the exact time to hit the reset combination once
  363. again.   Now,  any  reset-resistant things (all captures, memtags, romtags etc.)
  364. are off and system is performing cold start. I think that there is no need for a
  365. special program (like KillZKick), because this operation is handy and easy.
  366.  
  367.  
  368.  
  369. 6. Theory of operation
  370. ======================
  371.  
  372. This chapter will be included only in the developer's package.
  373.  
  374.  
  375. 7. Troubleshooting
  376. ==================
  377.  
  378. Symptom            Cause            Solution
  379. ---------------------------------------------------------------------------
  380. Error message from    According to the    According to the message
  381. SKick is displayed    message
  382.  
  383. Power LED blinks    Many...            Try a different kickstart to 
  384. after kicking                    find the problem
  385.  
  386. Kickstart does not    ColdCapture        Do not use programs modifying
  387. survives reboot        changed, ExecBase    ColdCapture and corrupting
  388.             corrupted        system areas
  389.  
  390. Kickstart does not    Crash too deep        Don't crash :-)
  391. survives crash        (ExecBase destroyed)
  392.  
  393. Power LED blinks    Kickstart checksum    Possibly after a crash.
  394. repeatedly, RED        failed (image        Don't modify running images!
  395. screen            patched/destroyed)
  396.  
  397. Any other        I don't know        Ask me for a solution, if You
  398.                         can't find any (use E-mail).
  399.  
  400. 8. File structures
  401. ==================
  402.  
  403. 8.1 .RTB file
  404.  
  405. .RTB  file  consists  of  two parts.  The first part contains all the relocation
  406. offsets  compressed  by  my  own simple algorithm.  It is created with a special
  407. program  called  RTG  (relocation  table generator) from specially pre-processed
  408. kickstart  image.   How  to  get  this image, it is my magic and I'll never tell
  409. anybody  about  it.  One note only:  generation of 39.046 .RTB took 1 1/2 hours.
  410. (Manual work, + about 10 mins my 7MHz '010 CPU time).  Second part contains BCPL
  411. relocation  table and it is required for 1.3 ROM only.  It was created manually,
  412. analysing  dos.library,  which is written in BCPL in 1.3.  .RTB file is not easy
  413. to create.  I don't recommend anybody to try it *without* very good knowledge of
  414. assembly  language and machine code (not the same).  N.B.  Auxiliary tools to do
  415. such work took 1 month to develop.
  416.  
  417. 8.2 .PAT file
  418.  
  419. Patch file has a very simple structure.  It contains pairs of longs.  Every pair
  420. represents  an  offset  from  kickstart  beginning (first long) and the value to
  421. patch  (the  second one).  Bytes and words cannot be patched individually, every
  422. patch  must be coded as a long, even with 3 bytes identical with original.  When
  423. a  longer  patch  is to be coded, it must be coded as a sequence of these simple
  424. patches.   This  stupid mechanism will be improved in next release.  There is no
  425. order specified, because every patch has its own, fully coded offset.  It allows
  426. simple  addition  of new patches to the existing file.  Patch file must be ended
  427. with two longs of zeros.
  428.     From  revision  3.12,  there may be also relocative patches coded.  They
  429. differ from a standard patch by the most significant bit of offset, which is set
  430. to  1.  In this case, current loading address is added to the patch value before
  431. storing  it.  This feature is needed for 39.110 patch.  For example, to code JMP
  432. start+$7F900  patch  to  the address start+$100, where start is the current loa-
  433. ding  address,  use the sequence 000000fe XXXX4ef9 80000102 0007f900, where XXXX
  434. is original contents of ROM at address start+$fe.
  435.  
  436. N.B. To create patch file, I'm using this algorithm:
  437. 1) First, I patch new values directly into the kickstart with a debugger.
  438. 2) I load another copy of kickstart into memory (my 6Megs allow this)
  439. 3) I write simple program to generate the patch file directly with debugger's
  440.    assembler (I'm using Mon 1.55 by Timo Rossi, which seems to be the most
  441.    powerful PD debugger known to me). This program is so simple so I never save
  442.    it.
  443. 4) I save (with the debugger) the table to the disk.
  444.  
  445. 9. Known bugs
  446. =============
  447.  
  448. On certain configurations, SKick crashes when kicking the image.  However, after
  449. a  manual  reset,  prepared image is kicked up and problems no more occur.  This
  450. bug  seems  to  occur  mostly  on A1000 and its cause is unknown yet.  The final
  451. kick-up  is done by performing system restart almost identical with manual reset
  452. and I don't know why this sometimes doesn't work.
  453. Problems  may  be  also  caused  by  some  non-standard add-ons and boards.  For
  454. example, Skick causes problems when ALF harddisk is on the system.  Its resident
  455. modules  interfere  with  SKick's module and the results are unstable.  However,
  456. under certain limitations (load image below the ALF's modules, not to the end of
  457. RAM) SKick seems to be usable.
  458.  
  459.  
  460. 10. Final words...
  461. ==================
  462.  
  463. This  program,  its documentation and all other files contained in this archive,
  464. are  (C) Copyright Pavel Troller, Jagellonska 16, 13000 Praha 3, Czech Republic.
  465. This  package is provided as is, any warranties cannot be applied.  Any usage of
  466. this program or other parts of this archive, will be done at Your own risk!
  467.  
  468.  
  469. If You have any suggestions, questions, criticisms or flames please feel free to
  470. write  me.  I'm sorry for the fact I'm very busy and I cannot reply by any other
  471. form  than  E-mail.   Also updates, new .RTB and .PAT files may be sent only via
  472. elec- tronic media.  Don't send disks, I will never return them!!!
  473.  
  474. My email address is:
  475.             Internet:    PATROL@ACI.CVUT.CS
  476.             BITNET:        PATROL@CSPUNI12.BITNET
  477.  
  478. And... Please excuse me for my very broken English. We learned English for many
  479. years, but practice is missing...
  480.